home *** CD-ROM | disk | FTP | other *** search
/ Ham Radio 2000 #1 / Ham Radio 2000.iso / ham2000 / tcp_ip / wnos / wn941101 / udpdump.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-10-07  |  4.8 KB  |  202 lines

  1. #include <stdio.h>
  2. #include <conio.h>
  3. #include "global.h"
  4. #include "mbuf.h"
  5. #include "netuser.h"
  6. #include "internet.h"
  7. #include "udp.h"
  8. #include "ip.h"
  9. #include "socket.h"
  10. #include "trace.h"
  11. #include "domain.h"
  12.  
  13. static void near dom_dump __ARGS((FILE *fp,struct mbuf **bpp,int check));
  14. static void near trput_rr __ARGS((FILE *fp,struct rr *rrp));
  15.  
  16. /* Dump a UDP header */
  17. void
  18. udp_dump(fp,bpp,source,dest,check)
  19. FILE *fp;
  20. struct mbuf **bpp;
  21. int32 source,dest;
  22. int check;              /* If 0, bypass checksum verify */
  23. {
  24.         struct udp udp;
  25.         struct pseudo_header ph;
  26.         int16 csum;
  27.  
  28.         if(bpp == NULLBUFP || *bpp == NULLBUF)
  29.                 return;
  30.  
  31.         /* Compute checksum */
  32.         ph.source = source;
  33.         ph.dest = dest;
  34.         ph.protocol = UDP_PTCL;
  35.         ph.length = len_p(*bpp);
  36.         csum = (check == 1) ? cksum(&ph,*bpp,ph.length) : 0;
  37.  
  38.         ntohudp(&udp,bpp);
  39.  
  40.     textattr(LIGHTBLUE);
  41.         trprintf(fp,"UDP: len %u %u->%u",udp.length,udp.source,udp.dest);
  42.  
  43.         /* an all zero transmitted checksum means that sender generated */
  44.         /* no checksum */
  45.         if(udp.checksum == 0)
  46.           csum = 0;
  47.  
  48.         if(csum)
  49.                 trprintf(fp," CHECKSUM ERROR (%u)",csum);
  50.         trprintf(fp,"\n");
  51.  
  52.         if(udp.source == IPPORT_DOMAIN || udp.dest == IPPORT_DOMAIN)
  53.                 dom_dump(fp,bpp,0);
  54. }
  55.  
  56. static void near
  57. dom_dump(fp,bpp,check)
  58. FILE *fp;
  59. struct mbuf **bpp;
  60. int check;
  61. {
  62.     struct dhdr *dhdr;
  63.     struct quest *qp;
  64.     int i;
  65.     char *Dopcode[] = {
  66.         "QUERY", "IQUERY", "STATUS", "?", "?", "?", "?", "?", "?", "UPDATEA",
  67.         "UPDATED", "UPDATEDA", "UPDATEM", "UPDATEMA", "ZONEINIT", "ZONEREF"
  68.     };
  69.     char *Drcode[] = {
  70.         "NOERROR", "FORMERR", "SERVFAIL", "NXDOMAIN", "NOTIMP", "REFUSED",
  71.         "?", "?", "?", "?", "?", "?", "?", "?", "?", "NOCHANGE"
  72.     };
  73.  
  74.     if(bpp == NULLBUFP || *bpp == NULLBUF)
  75.         return;
  76.  
  77.     dhdr = (struct dhdr *)mxallocw(sizeof(struct dhdr));
  78.  
  79.         if (ntohdomain(dhdr,bpp) == -1) {
  80.             free_dhdr(dhdr);
  81.                     return;
  82.                         }
  83.  
  84.     trprintf(fp,"DOMAIN: opcode %s status %s id %lu",
  85.         Dopcode[dhdr->opcode],Drcode[dhdr->rcode],dhdr->id);
  86.     trprintf(fp,"%s%s%s%s%s\n",
  87.         dhdr->aa ? " AA" : "",
  88.         dhdr->qr ? " QR" : "",
  89.         dhdr->rd ? " RD" : "",
  90.         dhdr->ra ? " RA" : "",
  91.         dhdr->tc ? " TC" : "");
  92.  
  93.     if(dhdr->qdcount) {
  94.         for(i = 0; i < dhdr->qdcount; ){
  95.             qp = dhdr->qlist[i++];
  96.             trprintf(fp,"        Quest%4d: name %s type %s class %s\n",
  97.                 i,
  98.                 qp->qname,
  99.                 type2str(qp->qtype),
  100.                 qp->qclass == 1 ? "Internet" : "[unknown]");
  101.         }
  102.     }
  103.  
  104.     if(dhdr->ancount) {
  105.         for(i = 0; i < dhdr->ancount; i++){
  106.             trprintf(fp,"        Answer%3d: ",i+1);
  107.             trput_rr(fp,dhdr->ans[i]);
  108.         }
  109.     }
  110.     if(dhdr->nscount) {
  111.         for(i = 0; i < dhdr->nscount; i++){
  112.             trprintf(fp,"        Author%3d: ",i+1);
  113.             trput_rr(fp,dhdr->ns[i]);
  114.         }
  115.     }
  116.     if(dhdr->arcount) {
  117.         for(i = 0; i < dhdr->arcount; i++){
  118.             trprintf(fp,"        Addit %3d: ",i+1);
  119.             trput_rr(fp,dhdr->add[i]);
  120.         }
  121.     }
  122.     free_dhdr(dhdr);
  123. }
  124.  
  125. static void near
  126. trput_rr(fp,rrp)
  127. FILE *fp;
  128. struct rr *rrp;
  129. {
  130.     if(fp == NULLFILE || rrp == NULLRR)
  131.         return;
  132.  
  133.     trprintf(fp,"%s",rrp->name);
  134.  
  135.     if(rrp->name[strlen(rrp->name)-1] != '.' && rrp->origin != NULLCHAR)
  136.         trprintf(fp,".%s",rrp->origin);
  137.  
  138.     if(rrp->ttl)
  139.         trprintf(fp," %lu",rrp->ttl);
  140.  
  141.     if(rrp->class == CLASS_IN) {
  142.         trprintf(fp," IN");
  143.     } else {
  144.         if(rrp->ttl == 0)
  145.             trprintf(fp," %lu",rrp->ttl);
  146.         trprintf(fp," %u",rrp->class);
  147.     }
  148.  
  149.     if(rrp->type < NDTYPES)
  150.         trprintf(fp," %s ",type2str(rrp->type));
  151.     else
  152.         trprintf(fp," %u ",rrp->type);
  153.  
  154.     /* Null data portion, indicates nonexistent record */
  155.     if(rrp->rdlength != 0) {
  156.         switch(rrp->type){
  157.         case TYPE_MINFO:    /* Unsupported type */
  158.             trprintf(fp,"%s %s",
  159.                 rrp->rdata.minfo.rmailbx,rrp->rdata.minfo.emailbx);
  160.             break;
  161.         case TYPE_MD:        /* Unsupported type */
  162.         case TYPE_MF:        /* Unsupported type */
  163.         case TYPE_NULL:        /* Unsupported type */
  164.         case TYPE_WKS:        /* Unsupported type */
  165.             trprintf(fp,"%s",rrp->rdata.data);
  166.             break;
  167.         case TYPE_CNAME:
  168.         case TYPE_MB:
  169.         case TYPE_MG:
  170.         case TYPE_MR:
  171.         case TYPE_NS:
  172.         case TYPE_PTR:
  173.         case TYPE_TXT:
  174.             /* These are all printable text strings */
  175.             trprintf(fp,"%s",rrp->rdata.data);
  176.             break;
  177.         case TYPE_A:
  178.             trprintf(fp,"%s",inet_ntoa(rrp->rdata.addr));
  179.             break;
  180.         case TYPE_MX:
  181.             trprintf(fp,"%u %s",
  182.                 rrp->rdata.mx.pref,rrp->rdata.mx.exch);
  183.             break;
  184.         case TYPE_SOA:
  185.             trprintf(fp,"%s %s %lu %lu %lu %lu %lu",
  186.                 rrp->rdata.soa->mname,rrp->rdata.soa->rname,
  187.                 rrp->rdata.soa->serial,rrp->rdata.soa->refresh,
  188.                 rrp->rdata.soa->retry,rrp->rdata.soa->expire,
  189.                 rrp->rdata.soa->minimum);
  190.             break;
  191.         case TYPE_HINFO:
  192.             trprintf(fp,"%s %s",
  193.                 rrp->rdata.hinfo.cpu,rrp->rdata.hinfo.os);
  194.         default:
  195.             break;
  196.         }
  197.     }
  198.     trprintf(fp,"\n");
  199.     return;
  200. }
  201.  
  202.